<?php
class Application_Model_QueueObjects extends Xend_Db_Model {
	protected $_dbTableName = 'Application_Model_Table_QueueObjects';

	public function __construct() {
		parent::__construct();
	}

	/**
	 * speichert einen neuen Eintrag von in der Queue verwendeten Objekten in die Tabelle
	 * queue_objects
	 * @param Application_Model_Schema_QueueObject $object
	 * @param int Id des zuletzt abgespeicherten Datensatzes
	 */
	public function save(Application_Model_Schema_QueueObject $object) {
		$data = array(
			'queue_id'							=> $object->queue->id,
			'game_objects_id'	=> $object->gameObject->id
		);

		return (int) $this->getDbTable()->insert($data);
	}

	/**
	 * speichert neue Eintraege von in der Queue benoetigten Resourcen in die Tabelle
	 * queue_resources
	 * @param array $data mit Eintraegen aus Application_Model_Schema_QueueResource
	 * @param none
	 */
	public function saveall($data) {
		foreach($data as $queueResource) {
			$this->save($queueResource);
		}
	}

	/**
	 * liesst alle Objekte aus, die einer Queue zugeordnet sind
	 * @param array $where Array mit Bedingungen, die an die Datenbank uebergeben werden
	 * @param array $ref Array mit Tabellen, die verknuepft werden sollen
	 * @return array Array mit den Daten, die aus der Datenbank geladen wurden
	 */
	public function findall($where = array(), $ref = array()) {
		$queueObjects	= array();
		$ref					= array_flip($ref);
		$select				= $this->_database
			->select()
			->from(
				array('queue_objects'),
        array('queue_objects.id', 'queue_objects.queue_id', 'queue_objects.game_objects_id')
			)
			->order(array('queue_objects.id'));

		// Where
		// -----------------------------------------------------------------------------------
		if(is_array($where) && !empty($where)) {
			foreach($where as $k => $v) {
				$select->where($k, $v);
			}
		}

		// Datenauswertung
		// -----------------------------------------------------------------------------------
		foreach($this->fetch($select) as $k => $v) {
			$dQueueObject	= new Application_Model_Schema_QueueObject();

			// ---------------------------------------------------------------------------------
			// Queue
			$dQueue = new Application_Model_Schema_Queue();
			$dQueue->setId($v['queue_objects']['queue_id']);

			// ---------------------------------------------------------------------------------
			// GameObject
			$dGameObject = new Application_Model_Schema_GameObject();
			$dGameObject->setId($v['queue_objects']['game_objects_id']);

			// ---------------------------------------------------------------------------------
			// Zuordnung
			$dQueueObject
				->setId($v['queue_objects']['id'])
				->setQueue($dQueue)
				->setGameObject($dGameObject);

			$queueObjects[(int) $v['queue_objects']['id']] = $dQueueObject;
		}

		// -----------------------------------------------------------------------------------
		// Referenzen verknuepfen
		if(empty($ref) === false && empty($queueObjects) === false) {
			if(array_key_exists('GameObjects', $ref)) {
				$queueObjects = $this->_assignGameObjectReferences($queueObjects);
			}
		}

		return $queueObjects;
	}

	/**
	 * verknuepft die, per Array uebergebenen, QueueObjects-Eintraege mit den Daten der
	 * referenzierten GameObjects
	 * @param array $sources Array mit den Daten der Queue-Resourcen
	 * @param array $references optionales Array mit den UID der Objekte
	 * @return array Array der QueueObjects-Eintraege mit den verknuepften Objektdaten
	 */
	protected function _assignGameObjectReferences($sources, $references = array()) {

		// falls nicht uebergeben, erstelle ein Reference-Array mit den UIDs der Objekte,
		// die geladen werden sollen
		if(empty($references)) {
			foreach($sources as $source) {
				$references[] = $source->gameObject->id;
			}
		}

		// lade referenzierte GameObjects
		$mGameObject	= new Application_Model_GameObjects();
		$dGameObject	= $mGameObject->findall(array('game_objects.id IN (?)' => $references));

		// GameObjects dem Source (QueueObjects) zuordnen
		foreach($sources as $source) {
			if(array_key_exists($source->gameObject->id, $dGameObject)) {
				$source->setGameObject($dGameObject[$source->gameObject->id]);
			}
		}

		return $sources;
	}
}
?>